package com.fsl.springbootdesignpattern.b_factory.abstract_factory;

import com.fsl.springbootdesignpattern.b_factory.simple_factory.Audi;
import com.fsl.springbootdesignpattern.b_factory.simple_factory.Benz;
import com.fsl.springbootdesignpattern.b_factory.simple_factory.Bmw;
import com.fsl.springbootdesignpattern.b_factory.simple_factory.Car;

public abstract class AbstractFactory {

    /**
     *  关于抽象类
     *  JDK 1.8以前，抽象类的方法默认访问权限为protected
     *  JDK 1.8时，抽象类的方法默认访问权限变为default
     *  关于接口
     *  JDK 1.8以前，接口中的方法必须是public的
     *  JDK 1.8时，接口中的方法可以是public的，也可以是default的
     *  JDK 1.9时，接口中的方法可以是private的
     * @return
     */
    protected abstract Car getCar();

    /**
     * 抽象类当中可以有方法实现，接口当中不能有实现
     * 通过这个特性，可以自动实现工厂选择而不需要像工厂方法一样用户需要自己去选择工厂
     * @param name
     * @return
     */
    public Car getCar(String name){
        switch (name)
        {
            case "Audi":
                return new Audi();
            case "Benz":
                return new Benz();
            case "Bmw":
                return new Bmw();
            default:
                return null;
        }
    }
}
